/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ourpkr.controler;

import java.util.List;
import java.util.Vector;
import ourpkr.OurPkrApp;
import ourpkr.model.joueur.Joueur;

/**
 *
 * @author anicolas
 */
public class Coup {

    List<Joueur> listeJoueurs;
    int pot = 0;

    public Coup() {
        initPot();
    }

    public void initJoueurs() {
        listeJoueurs = new Vector<Joueur>();
        for (Joueur j : OurPkrApp.getApplication().getPc().getJoueurs()) {
            //j.resetMiseCourante();Ne pas faire sinon on ne peut pas prend en compte les blinds
            if (j.isAlwaysInTour()) {
                listeJoueurs.add(j);
            }
        }
    }

    /** Initialise le pot */
    public void initPot() {
        pot = OurPkrApp.getApplication().getPc().getTour().getMainPot();
    }

    /** Mise minimum à jouer */
    public int getMiseMinimum() {
        int miseMax = 0;
        for (Joueur j : listeJoueurs) {
            if (j.getMiseCourante() > miseMax) {
                miseMax = j.getMiseCourante();
            }
        }
        return miseMax;
    }

    /** Vérifie que les mises sont égales entre tous les joueurs restants */
    public synchronized boolean continuerTour() {

        //On verifie qu'il reste au moins 2 joueurs
        Vector<Joueur> j = new Vector<Joueur>();
        for (Joueur tmp : listeJoueurs) {
            if (tmp.isAlwaysInTour()) {
                j.add(tmp);
            }
        }
        if (j.size() < 2) {
            return false;
        }

        int miseCourante = getMiseMinimum();
        if (miseCourante == 0) {
            return false;
        }

        for (Joueur tmp : j) {
            if (tmp.getMiseCourante() != miseCourante) {
                return true;
            }


        }
        return false;
    }
    
    /**
     * Retourne le nbre de joueurs qui sont encore dans le Tour
     */
    private int nbJoueursEnLice(){
        int res = 0;
        for(Joueur tmp : listeJoueurs){
            if(tmp.isAlwaysInTour()) res++;
        }
        return res;
    }

    public void joue() {
        // Récupération de la liste des joueurs restants dans le tour
        initJoueurs();
        
        //Si il reste moins de 2 joueurs dans le tour, on arrete
        if(listeJoueurs.size() < 2) return;
        
        //Premier tour de table avec tous les joueurs restants
        faireUnTourDeTable();

        //On continue tant que les mises differes
        while (continuerTour()) {
            faireUnTourDeTable();
        }
        for (Joueur j : listeJoueurs) {
            pot += j.getMiseCourante();
            j.resetMiseCourante();
        }
        OurPkrApp.getApplication().getPc().getTour().setMainPot(pot);
    }

    private void faireUnTourDeTable() {
        for (Joueur j : listeJoueurs) {
            if (nbJoueursEnLice() > 1 && j.getFortune() > 0 && j.isAlwaysInTour()) {
                faireJouerUnJoueur(j);
            }
        }
    }

    private void faireJouerUnJoueur(Joueur j) {
        int result = j.joue();
        switch (result) {
            case -1:
                // Se couche
                j.setAlwaysInTour(false);
                break;
            case 0:
                // Check
                int toMise = getMiseMinimum();
                j.setMiseCourante(toMise);
                break;
            default:
                // Le joueur a misé qqch ( > 0)
                if (result > getMiseMinimum()) {
                    j.setMiseCourante(result);
                }
                break;
        }
    }
}
